package cn.hongwei.service.impl;

import cn.hongwei.entity.Ad;
import cn.hongwei.mapper.AdMapper;
import cn.hongwei.service.AdService;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 广告推荐 服务实现类
 * </p>
 *
 * @author atguigu
 * @since 2021-07-07
 */
@Service
public class AdServiceImpl extends ServiceImpl<AdMapper, Ad> implements AdService {

    @Autowired
    RedisTemplate redisTemplate;
    /*
    查询首页热门数据时：
        1、先从redis查询。如果有直接返回
        2、如果redis中没有，从数据库查询
            查询到存到redis 并返回数据
    redis缓存的业务代码都是一样的，需要缓存的查询方法都要加入一样的redis缓存逻辑
        可以将缓存的业务操作使用切面的方式提取

    spring：
        已经提供了缓存自动管理的类：
        CacheManager：
            使用切面编程的方式，我们只需要实现该接口，并启用spring的自动缓存管理功能，
            spring就可以在指定的方法前后使用缓存管理实现类的方法管理缓存



     */
    // value:代表缓存的名称，一般使用模块名   key：代表缓存名称拼接时保证唯一的值，一般使用当前操作
    //key的值必须使用单引号引起 ， value和key拼接后存到redis中的key为：  ads::hotads
    @Cacheable(value ="ads"  ,key = "'hotads'")
    @Override
    public Map listAds() {
//        redisTemplate.setKeySerializer();配置redisTemplate存数据时的自定义 序列化
        //redisTemplate 存储自定义类型的对象时，自定义类需要实现序列化接口
//        Object adsMap = redisTemplate.opsForValue().get("ads");
//        if(adsMap!=null){
//            return (Map) adsMap;
//        }
        //查询数据库
        Map map = new HashMap();
        LambdaQueryWrapper<Ad> queryWrapper = new LambdaQueryWrapper<>();
        //排序：先根据typeid排序 再根据sort排序
        queryWrapper.orderByAsc(Ad::getTypeId, Ad::getSort);


        List<Ad> ads = baseMapper.selectList(queryWrapper);
        List<Ad> banners = new ArrayList<>();
        List<Ad> teachers = new ArrayList<>();
        List<Ad> courses = new ArrayList<>();

        for (Ad ad : ads) {
            if("1".equals(ad.getTypeId())){
                banners.add(ad);
            }else if("2".equals(ad.getTypeId())){
                teachers.add(ad);
            }else if("3".equals(ad.getTypeId())){
                courses.add(ad);
            }
        }
        map.put("banners" , banners);
        map.put("teachers" , teachers);
        map.put("courses" , courses);
        //将查询到的结果存到redis中
//        redisTemplate.opsForValue().set("ads" , map , 60 , TimeUnit.MINUTES);
        return map;
    }
    // 百度一下： 键可以自动构建
    @Cacheable(value = "ads" , key="'ad'")
    @Override
    public Ad getAd(String id) {
        return baseMapper.selectById(id);
    }
}
